昨天有提到我希望可以打包開發環境的 ubuntu 環境讓 ML 的 app 順利運行,但遇到 init 此環境挫折滿滿。原本打算直接用 docker commit 抓當前環境當 base image,但我白天還是試了根據 error 安裝對應 Repo 的方式加上忽略無法安裝的 package 的方式想要測試是否可行
# Add Docker repository
RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# Add Google Cloud repository
RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -
RUN xargs -a /tmp/linux_requirements.txt apt-get install -y --no-install-recommends || true
打包好一份 Code 之後,接下來我要上到 GKE 的 JOB 上看看可不可行了!另外,再跟同事詢問如何測試 ML 這包 code 的時候,他有提到要帶一些參數,所以我有改了一下 Dockerfile
觸發 job 要可以運行帶參數
# 創建 secrets 目錄
RUN mkdir -p /app/secrets
# 複製 GCS 密鑰文件
COPY ./secrets/gcs-user-key.json /app/secrets/gcs-user-key.json
# 設置環境變量
ENV GCS_KEY_PATH=/app/secrets/gcs-user-key.json
# 設置啟動命令
CMD ["python", "predict.py", \
"--job_id", "fake_job_id", \
"--credential", "${GCS_KEY_PATH}", \
"--source-bucket-name", "ops-payment-invoice", \
"--result-bucket-name", "ops-payment-invoice"]
遇到 Cloud Auth 問題,改用以下 code update config
- gcloud auth configure-docker asia-east1-docker.pkg.dev -q
利用此 image 觸發 job,看看可不可行
gcloud pubsub topics publish gke-job-trigger-topic --message="Trigger GKE job now"
❯ kubectl get pods
NAME READY STATUS RESTARTS AGE
python-logger-job-20241009-083116-gld55 0/1 Completed 0 2m24s
❯ kubectl logs python-logger-job-20241009-083116-gld55
2024-10-09 08:32:41,790 - 開始執行腳本
2024-10-09 08:32:41,910 - 這是第 1 條日誌訊息
2024-10-09 08:32:42,910 - 這是第 2 條日誌訊息
2024-10-09 08:32:43,918 - 這是第 3 條日誌訊息
2024-10-09 08:32:44,920 - 這是第 4 條日誌訊息
2024-10-09 08:32:45,921 - 這是第 5 條日誌訊息
2024-10-09 08:32:46,921 - 腳本執行完畢
忘記要 trigger GPU
job = client.V1Job(
api_version="batch/v1",
kind="Job",
metadata=client.V1ObjectMeta(name=job_name),
spec=client.V1JobSpec(
template=client.V1PodTemplateSpec(
spec=client.V1PodSpec(
containers=[
client.V1Container(
name=container_name,
image=container_image,
resources=client.V1ResourceRequirements(
limits={"nvidia.com/gpu": 1}
)
)
],
restart_policy="Never",
node_selector={"cloud.google.com/gke-accelerator": "nvidia-tesla-t4"}
)
),
backoff_limit=4,
ttl_seconds_after_finished=3600 # 添加这行,Job 完成后保留 1 小时
)
)
要特別記得 node selector 不然會遇到 cloudfunction 出錯的問題
You must specify a GPU type with node selector 'cloud.google.com/gke-accelerator' when GPU is requested on Autopilot workloads
可行,利用原始 code 打包 image
利用此 image 觸發 job,看看可不可行
不可行,要重新打包 image